提到異常腦子浮現出一首去年很喜歡的歌 (very relatable🥹)
在現在這個數位化的時代,建構 robust、易於維護和彈性的系統變得越來越重要。當用戶遇到錯誤或異常時,提供清晰和有幫助的錯誤訊息能夠增加用戶體驗。Spring Boot 作為一個廣泛使用的 Java 的框架也提供了一系列的工具來處理例外/異常。Day 11 要來介紹 @ControllerAdvice 和 @ExceptionHandler 。
在傳統 Spring MVC 應用程式中,例外處理可能會散佈在整個系統中,不僅管理上困難,也增加了後續維護成本。但在 Spring Boot 中透過集中式的例外處理策略,可以讓結構更整潔。
@ExceptionHandler 是一個 method 層級的註釋,它可以捕捉並處理特定類型的例外。當 Controller 中的方法拋出特定的例外時,加上 @ExceptionHandler 註釋的方法將被呼叫。
通常,我們在 controller 內部用它來處理特定 controller 中可能發生的例外,是一個「局部」的例外處理策略。
雖然 @ExceptionHandler 提供了在 controller 處理例外的功能,但當多個 controller 有相同的例外處理邏輯時,這種方法可能會導致無數重複的程式碼。
這時,@ControllerAdvice 就派上了用場。這是一個 class 等級的註釋,用來定義「全域」的例外處理策略。通常會和 @ExceptionHandler 一起使用,這樣在整個應用程式範圍內的特定例外都可以被捕捉並處理。
@RestControllerAdvice。旨在簡化程式碼,同時提供全域的例外處理,確保 repsonse 會以 JSON 或其他形式自動序列化。IllegalArgumentException 的例外,並回傳一個自定義的錯誤訊息。我們可以這樣做:@RestControllerAdvice
public class GlobalRestExceptionHandler {
@ExceptionHandler(IllegalArgumentException.class)
public ResponseEntity<Map<String, String>> handleIllegalArgumentException(IllegalArgumentException ex) {
Map<String, String> errorMap = new HashMap<>();
errorMap.put("error", "Invalid argument");
errorMap.put("message", ex.getMessage());
return ResponseEntity.badRequest().body(errorMap);
}
}
在上述程式碼中:
@RestControllerAdvice 註釋來表示這是一個全域的 REST 例外處理器。@ExceptionHandler 註釋指定我們想要捕獲的例外類型。使用 @RestControllerAdvice 主要好處是不必在每個 @ExceptionHandler 方法上添加 @ResponseBody(因為已經包含在 @RestControllerAdvice 中),並且確保了一致的異常處理。
Spring Boot 提供了強大的工具來幫助我們處理例外情況。透過 @ExceptionHandler 和 @ControllerAdvice,我們可以建立清晰、組織化的例外處理策略。